home *** CD-ROM | disk | FTP | other *** search
- ;;; -*- Mode: Lisp; Package: Maxima; Syntax: Common-Lisp; Base: 10 -*- ;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;; The data in this file contains enhancments. ;;;;;
- ;;; ;;;;;
- ;;; Copyright (c) 1984,1987 by William Schelter,University of Texas ;;;;;
- ;;; All rights reserved ;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;; (c) Copyright 1980 Massachusetts Institute of Technology ;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (in-package "MAXIMA")
- (macsyma-module procs macro)
-
- ;;; Fast dispatching off the property list with SUBRCALL.
- ;;; MARCH 1980. -GJC
-
- ;;; The advantages:
- ;;; [1] (SUBRCALL NIL (GET (CAR FORM) 'FOO) FORM) is fast! (PUSHJ P @ 0 P)
- ;;; [2] Creates no extra symbols of the kind |NAME FOO|.
- ;;; The problems with using SUBRCALL:
- ;;; [1] Only have subrs in compiled code.
- ;;; [2] System-dependant.
- ;;; [3] Fixed number of arguments.
-
- ;;; This macro package fixes problems [1] and [2].
- ;;; Number [3] isn't a problem for the parsers, translators and tree-walkers
- ;;; in macsyma.
-
- (defun verify-as-subr-argument-list (property l n)
- (if (or (memq '&rest l)
- (memq '&optional l))
- (MAXIMA-ERROR (list "bad argument list for a" property "property.") l)
- (let ((length (f- (length l)
- (length (memq '&aux l)))))
- (if (eq n '*)
- (if (< length 6.)
- length
- (MAXIMA-ERROR (list "argument list too long for a" property "property.") l))
- (if (= n length)
- length
- (MAXIMA-ERROR (list "argument list for a" property "property must be"
- n "long.")
- l))))))
-
-
- (defun a-def-property (name argl body property n)
- (verify-as-subr-argument-list property argl n)
- (cond
- #-cl
- ((status feature pdp10)
- (cond ((memq compiler-state '(maklap compile))
- `(defun-prop (,name nil ,property) ,argl . ,body))
- ('else
- (let ((f (symbolconc name '- property)))
- `(progn (defprop ,name ,(make-jcall n f) ,property)
- (defun ,f ,argl . ,body))))))
- ('else
- `(defun-prop (,name ,property) ,argl . ,body))))
-
- (defmacro def-def-property (name sample-arglist)
-
- `(defmacro ,(symbolconc 'def- name '-property) (name argl . body)
- (a-def-property name argl body ',name
- ',(verify-as-subr-argument-list 'def-def-property
- sample-arglist
- '*))))
-
- #+PDP10
- (progn 'compile
- (defun make-jcall (number-of-arguments name-to-call)
- (boole boole-ior #.(f* 13 (^ 2 27.))
- (lsh number-of-arguments 23.)
- (maknum name-to-call)))
- ;; SUBRCALL does argument checking in the interpreter, so
- ;; the FIXNUM's won't pass as subr-pointers.
- ;; The following code must be compiled in order to run interpreted code
- ;; which uses SUBR-CALL and DEF-DEF-PROPERTY.
- (defun subr-call-0 (f) (subrcall nil f))
- (defun subr-call-1 (f a) (subrcall nil f a))
- (defun subr-call-2 (f a b) (subrcall nil f a b))
- (defun subr-call-3 (f a b c) (subrcall nil f a b c))
- (defun subr-call-4 (f a b c d) (subrcall nil f a b c d))
- (defun subr-call-5 (f a b c d e)(subrcall nil f a b c d e))
- (DEFMACRO SUBR-CALL (F &REST L)
- (IF (MEMQ COMPILER-STATE '(MAKLAP COMPILE))
- `(SUBRCALL NIL ,F ,@L)
- `(,(cdr (zl-ASSOC (length l)
- '((0 . subrcall-0)
- (1 . subrcall-1)
- (2 . subrcall-2)
- (3 . subrcall-3)
- (4 . subrcall-4)
- (5 . subrcall-5))))
- ,f ,@l)))
- )
-
- #-PDP10
- (DEFMACRO SUBR-CALL (F &REST L) `(FUNCALL ,F ,@L))
-